//*******************************************引入头文件*********************************************

#include <stdio.h>   //使用了标准库函数
#include <windows.h>
//******************************************自定义符号常量*******************************************

#define DestoryList ClearList  //DestoryList()和ClearList()的操作是一样的
#define OVERFLOW -2            //内存溢出错误常量
#define ILLEGAL -1             //非法操作错误常量
#define OK 1                   //表示操作正确的常量
#define ERROR 0                //表示操作错误的常量
#define TRUE 1                 //表示逻辑正确的常量
#define FALSE 0                //表示逻辑错误的常量

//******************************************自定义数据类型********************************************

typedef char ElemType;     //元素类型
typedef int  Status;       //状态参量类型

//----------------线性表的静态单链表存储结构--------------------
#define MAXSIZE 11   //链表的最大长度
typedef struct{
    int length; // 长度
    ElemType data[];   //数据域
}ArrayList;

//***************************************线性静态单链表的主要操作******************************************
/*
	函数：initList
	参数：ArrayList *list 静态链表首地址
	返回值：是否成功
	作用：构造一个空链表。涉及到改值，所以需要的是指针参数
*/
Status initList(ArrayList *list){
    list->length = 0;
    return OK;
}

/*
	函数：listEmpty
	参数：ArrayList list 静态链表list
	返回值：若list是空表，返回TRUE，否则返回FALSE
	作用：判断静态链表list是否是空表
*/
Status listEmpty(ArrayList list) {
    if(list.length == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

/*
	函数：listInsert
	参数：ArrayList list 静态链表list
		  int i 在第i个位置插入
		  ElemType e 插入的值为e
	返回值：状态码，OK表示操作成功，ERROR表示操作失败
	作用：在静态链表List中第i个元素插入新的数据元素e。暂时不考虑扩容的问题.
*/
Status listInsert(ArrayList *list,int index,ElemType e) {

    // 检查索引是否合法
    if(list->length == MAXSIZE || index<1 || index>MAXSIZE){
        return FALSE;
    }

    // 指定位置插入
    for(int a=list->length-1;a>=index-1;a--){
        list->data[a+1] = list->data[a];
    }

    // 保存数据
    list->data[index-1] = e;
    list->length++;
    //操作成功
    return OK;
}

/* TODO 遍历链表，输出抽出来作为函数，下面注释的函数输出数据不是塞入的数据而是0，猜测是编译器的问题*/
int listTraverse(ArrayList *list){
    for(int a=0;a<list->length;a++){
        printf("第%d个数据是%d\n",a,list->data[a]);
    }
    printf("遍历结束\n");
    return OK;
}
//int listTraverse(ArrayList list){
//    for(int a=0;a<list.length;a++){
//        printf("第%d个数据是%d\n",a,list.data[a]);
//    }
//    printf("遍历结束\n");
//    return OK;
//}

/*清空链表*/
int clearList(ArrayList *list){
    for(int a=0;a<list->length;a++){
        list->data[a] = NULL;
    }
    list->length = 0;
    return TRUE;
}

/* 删除指定位置数据 */
int listDelete(ArrayList *list,int index){
    if(list->length == 0 || index<1 || index>list->length){
        return FALSE;
    }
    for(int a=index-1;a<list->length;a++){
        list->data[a+1] = list->data[a];
    }
    // 最后一个元素置为空
    list->data[list->length-1] = NULL;
    list->length--;
    return TRUE;
}

/*获取某个数据*/
int getData(ArrayList list,int index){
    // 校验
    if(list.length == 0 || index <0 || index >=list.length){
        return -1;
    }
    printf("获取第%d位置的值:%d,链表长度%d\n",index,list.data[index-1],list.length);
    return list.data[index-1];
}

//**********************************************主函数********************************************

int main(){
    system("chcp 65001 > nul");
    Status status;

    // 声明链表并初始化
    printf("->初始化链表\n");
    ArrayList list ;
    status= initList(&list);
    printf("->初始化链表结束\n");

    // 判空
    printf("->判断链表是否为空：");
    if(listEmpty(list) == TRUE){
        printf("是\n");
    }else{
        printf("否\n");
    }

    //从键盘接收集合A的每个元素，并使用它们建立的静态链表
    for(int i = 1; i <= 5; i++) {
        //将新结点插入到链表中
        listInsert(&list, i, i);
    }

    printf("->静态链表A初始化之后所有结点元素值如下: \n");
    listTraverse(&list);

    printf("->获取指定位置的数据\n");
    int m;
    scanf("%d", &m);
    printf("获取指定%d位置的数据:%d\n",m, getData(list,m));

    printf("->静态链表A是否为空：");
    if(listEmpty(list) == TRUE) {
        printf("是\n");
    }
    else {
        printf("否\n");
    }

    printf("->静态链表A的表长：%d\n", list.length);

    // TODO这里输出的结果与函数不一样，猜测是编译器的问题
    for(int a=0;a<list.length;a++){
        printf("第%d个数据是%d\n",a,list.data[a]);
    }
    return 0;
}